#include <stdio.h> 
#include <stdlib.h>
#include <sys/types.h> 
#include <sys/wait.h> 

int main(int argc, char *argv[]) 
{ 
	//Contador de procesos hijo	
	int i=1;
	//Factor de multiplicación del tiempo de espera
	int f=10;
	//Variable para almacenar el estado de un subproceso
	int estado;
	//Contador de procesos hijo por crear
	int n=0;
	//Variable para almacenar el tiempo total que espera el proceso padre
	int t=0;
	//Codigo de retorno de la función fork	
	pid_t hijo=0;
	//Si nos han pasado argumentos	
	if (argc>1 && atoi(argv[1])>1 && atoi(argv[1])<10) {
		//Los guardamos en la variable n
		n=atoi(argv[1])-1;	
		//Mostramos la información del proceso padre
		printf("PADRE PID:%d, PPID: %d\n", getpid(), getppid());  	
			//Bucle de creación de subprocesos hijo
			while (n!=0) {
				//Llamada a fork
				hijo=fork();	
					//Si la variable hijo tiene valor 0 es que estamos en un subproceso hijo
					if (hijo==0) {
					//Mostramos su información y el tiempo de espera
					printf("HIJO %d PID:%d, PPID: %d voy a dormir %d segundos\n",i, getpid(), getppid(),i*f);									
					//Lo dormimos
					sleep(i*f);
					//Cuando despierta indica que va a morir	
					printf("HIJO %d he muerto \n",i);
					exit(i*f);
					}
					else if (hijo==-1) printf("Error al crear el hijo %d \n",i);
				//Decrementamos el numero de subprocesos por crear (esto solo lo ejecuta el proceso padre)	
				n--;
				//Incrementamos el contador de subprocesos creados (esto solo lo ejecuta el proceso padre)
				i++;
			}
			printf("Ha muerto el hijo con PID %d \n",wait(&estado));
			t+=WEXITSTATUS(estado);
			i--;		
		printf("Tiempo total esperado de los hijos-> %d segundos \n",t);
	}
	else printf("Error en el paso de parametros (1,10)\n");	
}
